<?php 
	
	/**
	* 微信登陆授权类
	* 设置相关参数即可
	* 2016年12月16日16:23:23
	* by：lecon
	* QQ：27941662
	*/


	class Wxlogin
	{

		// 公众号相关配置
		private $config = array(
			'TOKEN'       =>  '',								// 与微信对接所需要的TOKEN
			'WxAppId'     =>  '',    					// 微信公众号的APPid
			'WxAppSecret' =>  '' 		// 微信公众号的密钥
		);


		// 自执行函数
		function __construct()
		{
			// 与服务器进行普通绑定链接 第一次绑定时开启
			// $this->valid();exit;
			
			// 开启SESSION[储存]
			session_start();


			// 判断用户是否已经访问过网站
			if (isset($_SESSION['wxuserinfo']['openid'])) {
				// 如果已经访问过网站则不采取任何操作
			}else{
				// 如果不是访问过我们网站则判断访问来源
				if (isset($_GET['code']) and $_GET['state'] == 'STATE') {
					// 从微信公众号进入访问
					// 获取用户的openid
					$Tmparr = $this->openid();
					if (isset($Tmparr['errcode'])) {
						$this->ahref();
					}
					// 获取用户的详细资料
					$arr = $this->user($Tmparr);
					$_SESSION['wxuserinfo'] = $arr;
				}else{
					// 从其它地方访问进入 例如 朋友分享 输入网址 朋友圈分享
					// 模拟从微信公众号进入网站
					$this->ahref();
				}
			}
		}

		// 模拟微信公众号进入网站
	    public function ahref(){
	    	// 获取当前的URL完整地址
			$url = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']);
			// 生成微信URL模拟链接
			$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx5e16148d842d7fb6&redirect_uri='.$url.'&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';
			// 通过head头进行页面跳转 
			header('location:'.$url);
	    }

	    // 服务器与微信公众号进行绑定
	    public function valid()
	    {
	        $echoStr = $_GET["echoStr"];        // 保存微信发过来的随机字符串
	        
	        if($this->checkSignature()){
	            echo $echoStr;
	            exit;
	        }
	    }

	    // 服务器验证绑定详细步骤
	    private function checkSignature()
		{
		    $signature = $_GET["signature"];
		    $timestamp = $_GET["timestamp"];
		    $nonce = $_GET["nonce"];
		        
			$token = $this->config['TOKEN'];
			$tmpArr = array($token, $timestamp, $nonce);
			sort($tmpArr, SORT_STRING);
			$tmpStr = implode( $tmpArr );
			$tmpStr = sha1( $tmpStr );

			if( $tmpStr == $signature ){
			return true;
			}else{
			return false;
			}
		}

		// 获取用户的openid以及授权验证access_token
		private function openid()
		{
			// 组合接口调用网址 需要通过GET方式传递公众号的APPID 以及SECRET和通过传递过来的code值
			$url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$this->config['WxAppId'].'&secret='.$this->config['WxAppSecret'].'&code='.$_GET['code'].'&grant_type=authorization_code';
			// 调用自定义函数进行获取openid以及access_token
	    	$arr = $this->request($url);
	    	// 将获取到的值进行返回
	    	return $arr;
		}

		// 获取进入网站的微信用户详细资料
		private function user($arr)
		{
			// 组合接口调用网址 需要通过GET方式传递用于授权登陆的access_token以及公众号APPID
			$url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$arr['access_token'].'&openid='.$arr['openid'].'&lang=zh_CN ';
			// 调用自定义函数进行获取用户信息	
	    	$arr = $this->request($url);
	    	// 将查询到的数据进行返回操作
	    	return $arr;
		}

		// 自定义API接口调用函数 基于CURL函数进行
	    // $URL 默认参数为微信获取微信接口调用的凭证access_token
	    // $https 是否采用https协议方式进行接口调用
	    // $method 传递数据的方式 默认为GET方式
	    // $data 如果采用POST方式 则需要传递数据 数据格式为数组或JSON
	    private function request($url='',$https=true,$method='get',$data=null){
	        // 判断$url是否为空
	        if ($url == '') {
	            $url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->config['WxAppId'].'&secret='.$this->config['WxAppSecret'];
	        }
	        //1.初始化url
	        $ch = curl_init($url);
	        //2.设置相关的参数
	        //字符串不直接输出,进行一个变量的存储
	        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	        //判断是否为https请求
	        if($https === true){
	          curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	          curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
	        }
	        //判断是否为post请求
	        if($method == 'post'){
	          curl_setopt($ch, CURLOPT_POST, true);
	          curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
	        }
	        //3.发送请求
	        $str = curl_exec($ch);
	        //4.关闭连接,避免无效消耗资源
	        curl_close($ch);
	        //返回请求到的结果
	    	$arr = json_decode($str,true);		// 将JSON串转换为数组
	        return $arr;
	    }

}


 ?>